"""
希望这个统一的方法里覆盖各种参数的传递方式
 json参数
 fromdata参数
 文件参数等各种参数类型都能覆盖到
希望这个统一的方法里能覆盖各种请求方法
    get post put等

传参的方法：
1、get请求，param接受
2、post请求：content-type类型有关
    - application/json格式数据，json关键字接收参数，content-type的头部不需要传 默认就是json
    - application/x-www-form-urlencoded,data关键字接收参数，content-type的头部不需要传 默认就是data
    - multipart/form-data:支持文件/图片等传输，一般都是文件，图片上传接口
        - 发送请求时候不能带上 "content-type":"multipart/form-data"

步骤：
1、def函数封装：因为针对excel读取的数据 -- 头部 请求方法 参数 url 等 -- 参数数据参数化
2、参数和头部读取出来是字符串，所以都要做反序列化操作
3、接口请求可能是get post put等各种请求方法，分支判断
4、有些接口有头部 有些接口没有头部？ -- 做判空处理
5、post方法的数据格式 -- content-type有多种情况 所以都要覆盖
6、当遇到文件类型接口的时候，文件参数如何处理？ -- 不能写死
    - 文件名字:作为测试用例的数据写在excel里，方便后续做数据维护 改excel表格 不需要改代码
    - 文件路径处理：统一的路径处理 read_pathlib
"""
import json
from tools.read_pathlib import pic_path
import requests
from jsonpath import jsonpath


def requests_api(data):
    method = data["请求方法"]
    url = data["接口地址"]
    header = data["请求头"]
    param = data["请求参数"]
    # 反序列化操作：结合判空处理
    if header is not None:
        header = json.loads(header)
    if param is not None:
        param = json.loads(param)
    # 接口请求可能是get post put等各种请求方法，分支判断
    if method.lower() == "get":
        res = requests.request(method=method,url=url,params=param,headers=header)
    elif method.lower() == "post":
        # post请求：content-type的类型有关系，需要对每一种类型做处理，分支判断
        if header["Content-Type"] == "application/json":
            res = requests.request(method=method, url=url, json=param, headers=header)
        if header["Content-Type"] == "application/x-www-form-urlencoded":
            res = requests.request(method=method, url=url, data=param, headers=header)
        if header["Content-Type"] == "multipart/form-data":
            # 发送请求时候不能带上 "content-type":"multipart/form-data"
            header.pop("Content-Type") # 字典删除元素
            filename = param["filename"] # 文件名字的值
            obj_file = {"file":(filename,open(pic_path/filename,"rb"))}
            res = requests.request(method=method,url=url,headers=header,files=obj_file)
    elif method.lower() == "put":
        pass
    return res



